package model.service;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import model.dao.AdminDao;
import model.dao.MovieDao;
import model.dao.ReserVationDao;
import model.dao.TheaterDao;
import model.vo.movie.CountryVO;
import model.vo.movie.GenreVO;
import model.vo.movie.MovieGradeInfo;
import model.vo.movie.MovieVO;
import model.vo.movie.StaticsVO;
import model.vo.mycinema.ListVOGenericMap;
import model.vo.mycinema.PagingBean;
import model.vo.reservation.ScreeningMovieVO;
import model.vo.theater.LocalInfoVO;
import model.vo.theater.PlayRoomTypeVO;
import model.vo.theater.PlayRoomVO;
import model.vo.theater.TheaterVO;

public class AdminService {
	private AdminDao adminDao;
	private ReserVationDao resDao;
	private MovieDao movieDao;
	private TheaterDao theaterDao;
	public AdminService() {
		super();
		// TODO Auto-generated constructor stub
	}

	public void setAdminDao(AdminDao adminDao) {
		this.adminDao = adminDao;
	}
	public void setResDao(ReserVationDao resDao) {
		this.resDao = resDao;
	}

	public void setMovieDao(MovieDao movieDao) {
		this.movieDao = movieDao;
	}
	public void setTheaterDao(TheaterDao theaterDao) {
		this.theaterDao = theaterDao;
	}
	public ArrayList<GenreVO> getGenreInfo() throws SQLException {
		System.out.println("adminService..getGenreInfo");
		return adminDao.getGenreInfo();
		
	}

	public ArrayList<CountryVO> getCountryInfo() throws SQLException {
		System.out.println("adminService..getCountryInfo");
		return adminDao.getCountryInfo();
	}

	//영화관 정보 입력을 위해 초기 지역 정보 리스트를 로딩 : 신일
	public ArrayList<LocalInfoVO> getLocalInfo() throws SQLException {
		ArrayList<LocalInfoVO> lList=new ArrayList<LocalInfoVO>();
		lList=resDao.getLocalList();
		System.out.println("adminService..getLocalInfoVO "+lList);
		return lList;
	}
	//영화관 등록 메서드 : 신일
	public void registerTheater(TheaterVO theaterVO) throws SQLException {
		adminDao.registerTheater(theaterVO);		
	}
	//상영관 등록 메서드 : 신일
	public void registerPlayRoom(PlayRoomVO playRoomVO) throws SQLException {
		adminDao.registerPlayRoom(playRoomVO);		
	}
	//상영관 삭제 메서드 : 신일
	public void delPlayRoom(int playRoomNo) throws SQLException {
		adminDao.delPlayRoom(playRoomNo);
	}
	//상영관의 유니크 넘버를 가져옴 : 신일
	public int getPlayRoomNoByPlayRoomUniqNo(int playRoomNo) throws SQLException{
		return adminDao.getPlayRoomNoByPlayRoomUniqNo(playRoomNo);
	}
	//영화관 수정을 위해 영화관 정보를 리턴 TheaterVO 타입으로 로딩 : 신일
	public TheaterVO getTheaterVObyTNo(TheaterVO theaterVO) throws Exception{
		return adminDao.getTheaterVObyTNo(theaterVO);
	}
	//영화관 정보 수정 : 인자값 - TheaterVO : 신일
	public ArrayList<PlayRoomVO> modifyTheaterInfo(TheaterVO theaterVO) throws SQLException{
		adminDao.modifyTheaterVObyTheaterVO(theaterVO);
		return adminDao.getPlayRoomVObyTNO(theaterVO.getTheater_no());
	}
	//상영관 리스트 로딩 : 신일
	public ArrayList<PlayRoomVO> getPlayRoomVOList(TheaterVO theaterVO) throws SQLException{
		return adminDao.getPlayRoomVObyTNO(theaterVO.getTheater_no());
	}
	//상영관 타입 리스트를 로딩 : 신일
	public ArrayList<PlayRoomTypeVO> getPlayRoomTypeVO() throws SQLException{
		return adminDao.getPlayRoomTypeVO();
	}
	public ArrayList<MovieGradeInfo> getGradeInfo() throws SQLException {
		System.out.println("adminService..getGradeInfo");
		return adminDao.getGradeInfo();
	}

	public void registerMovie(MovieVO movieVO) throws SQLException {
		int movie_no=adminDao.registerMovie(movieVO);	
		System.out.println("service에서 movie 등록 완료!!");
		movieVO.setMovie_no(movie_no); //등록한 영화번호 
		movieVO.setOrgfileName(movie_no+""); //그 영화의 포스터 번호 
		//2. 통계테이블에 등록하기 
		this.regMovieToStatics(movieVO); //성별별로 statics table에 등록
		System.out.println("service에서 movie 등록 후 statics table에 등록 완료!");
	}

	public ArrayList<TheaterVO> getTheaterInfo() throws SQLException {
		return adminDao.getTheaterInfo();
	}

	public ArrayList<MovieVO> getMovieInfo() throws SQLException {
		return adminDao.getMovieInfo();
	}

	public void registerScreeningMovie(ScreeningMovieVO movieVO) throws SQLException {
		adminDao.registerScreeningMovie(movieVO);	
	}
	public void regScreeningMovie(ScreeningMovieVO movieVO) throws SQLException {
		System.out.println("service : "+movieVO);
		adminDao.regScreeningMovie(movieVO);	
	}
	public ArrayList<HashMap> getTheaterListByLocalNo(int local_no) throws SQLException {
		return resDao.getTheaterListByLocal(local_no);
	}
	public ArrayList<HashMap> getPublicDayByMovieNo(int movie_no) throws SQLException {
		return adminDao.getPublicDayByMovieNo(movie_no);
	}

	public ArrayList<HashMap> getScreeningMovieList() throws SQLException {
		return adminDao.getScreeningMovieList();
	}
	/** 
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 상영표 등록시 screening_movie 테이블에 있는 등록가능한
	 * 영화,지역,영화관 목록들을 가져온다.
	 * @throws SQLException 
	 */
	public HashMap timetable_admin_info(String pageNo) {
		HashMap map = new HashMap();
		try {
			map.put("movie", adminDao.getRegisterPossibleMovie());
			map.put("local", adminDao.getRegisterPossibleLocal());
			map.put("theater", adminDao.getRegisterPossibleTheater());
			if (pageNo == null || pageNo == "") 
				pageNo = "1";
			List<Map> list = adminDao.getTimeTable(pageNo);
			int total = adminDao.getTotalTimeTable();
			PagingBean paging = new PagingBean(total, Integer.parseInt(pageNo));
			ListVOGenericMap tlvo = new ListVOGenericMap(list, paging);
			map.put("time_table", tlvo);
			map.put("total", total);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return map;
	}
	/** 
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 상영표 등록시 (영화선택)에 따라서
	 * screening_movie 테이블에 있는 상영 가능한 (지역정보)를 가져온다. 
	 */
	public HashMap getLocalAsMovieNo(String movie_no)  {
		HashMap map = new HashMap();
		ArrayList<Map> list= null;
		try {
			map.put("list",adminDao.getLocalAsMovieNo(movie_no));
			map.put("tlist",adminDao.getTimeTableAsMovieNo(movie_no));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map;
	}
	/** 
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 상영표 등록시 (지역선택)에 따라서
	 * screening_movie 테이블에 있는 상영 가능한 (영화관정보)를 가져온다. 
	 */
	public HashMap getTheaterAsLocalNoAndMovleNo(Map map) {
		HashMap map2 = new HashMap();
		try {
			map2.put("list",adminDao.getTheaterAsLocalNoAndMovleNo(map));
			map2.put("tlist",adminDao.getTimeTableAsMovieNoAndLocalNo(map));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map2;
	}
	/** 
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 상영표 등록시 (영화관 선택)에 따라서
	 * play_room 테이블에 있는 해당 영화관의 (상영관목록)을 가져온다.
	 */
	public ArrayList<Map> getPlayRoomAsTheaterNo(String theater_no)  {
		ArrayList<Map> list= null;
		try {
			list = adminDao.getPlayRoomAsTheaterNo(theater_no);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}
	/** 
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 상영표 등록시 (영화선택)에 따라서
	 * play_room 테이블에 있는 해당 영화관의 (등록가능기간)을 가져온다.
	 */
	public HashMap getPossibleDateAsMovieNo(Map queryMap) {
		HashMap map = new HashMap();
		try {
			map = adminDao.getPossibleDateAsMovieNo(queryMap);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return map;
	}
	/** 
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 상영표 등록시 입력받은 정보를 time_table 에 하루치 insert
	 */
	public void timeTableOneDayRegister(HashMap map) {
		int hour = Integer.parseInt((String) map.get("hour"));
		int minute = Integer.parseInt((String) map.get("minute"));
		int running_time = 0;
		try {
			running_time = adminDao.getRunninTimeAsMovieNo((String) map.get("movie_no"));
			for (;;) {
				String starting_time = map.get("day") + " " + numberFormat(hour) + ":"	+ numberFormat(minute);
				map.put("starting_time", starting_time);
				hour = hour + running_time / 60;
				minute = minute + running_time % 60;
				if (minute >= 60) {
					hour++;
					minute -= 60;
				}
				if(hour>=24)
					break;
				String ending_time = map.get("day") + " " + numberFormat(hour)+ ":" + numberFormat(minute);
				map.put("ending_time", ending_time);
				map.put("play_room_uniq_no", adminDao.getPlayRoomUniqNoAsTheaterNoAndPlayRoomNo(map));
				adminDao.timeTableRegister(map);
				minute = minute + 25;
				if (minute >= 60) {
					hour++;
					minute -= 60;
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/** 
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 상영표 등록시 입력받은 정보를 time_table 에 insert
	 */
	public void timeTableRegister(HashMap map) {
		int hour = Integer.parseInt((String) map.get("hour"));
		int minute = Integer.parseInt((String) map.get("minute"));
		map.put("starting_time", map.get("day") + " " + numberFormat(hour) + ":" + numberFormat(minute));
		int running_time = 0;
		try {
			running_time = adminDao.getRunninTimeAsMovieNo((String) map.get("movie_no"));
			hour = hour + running_time / 60;
			minute = minute + running_time % 60;
			if (minute >= 60) {
				hour++;
				minute -= 60;
			}
			map.put("ending_time", map.get("day") + " " + numberFormat(hour)	+ ":" + numberFormat(minute));
			map.put("play_room_uniq_no", adminDao.getPlayRoomUniqNoAsTheaterNoAndPlayRoomNo(map));
			adminDao.timeTableRegister(map);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 날짜 type을 mm,dd 로 하기위한 
	 * numberForamt 메서드
	 * ex) 1/11 = 01/11 , 1/3 = 01/03
	 */
	public String numberFormat(int number){
		String str ="";
		if((number+"").length()==1)
			str="0"+number; 
		else
			str=""+number;
		return str;
	}
	/** 
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 상영표 등록시 (영화관, 영화선택)에 따라서
	 * play_room 테이블에 있는 해당 영화관의 (상영관목록과 등록가능시간)을 가져온다.
	 */
	public ArrayList<HashMap> getTimeTableAsMovieNoAndLocalNoAndTheaterNo(HashMap queryMap) {
		ArrayList<HashMap> list = null;
		try {
			list =  adminDao.getTimeTableAsMovieNoAndLocalNoAndTheaterNo(queryMap);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list;
	}
	/** 
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 상영관번호 선택시에 ajax로 해당 상영관에 time_table을 보여줌.
	 */
	public ArrayList<HashMap> getTimeTableAsAllNo(HashMap map) {
		ArrayList<HashMap> list = null;
		try {
			list =  adminDao.getTimeTableAsAllNo(map);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list;
	}
	public MovieVO showMovieDetail(int movie_no) throws SQLException {
		return movieDao.getMovieInfo(movie_no);
	}
	public ArrayList<HashMap> getAllMovieList() throws SQLException {		
		return movieDao.getAllMovieList();
	}
	/**
	 *	관리자메뉴 - 상영표관리 - 상영표관리
	 * 선택삭제시 선택한 list 를 StringFormat으로 ArrayList에 담고 삭제한다.
	 */
	public HashMap delTimeTable(ArrayList<String> list) {
		StringBuffer sb1 = new StringBuffer();
		StringBuffer sb2 = new StringBuffer();
		HashMap map = new HashMap();
		for(String str : list ){
			try {
				adminDao.delTimeTable(str);
				sb1.append(" "+str);
			} catch (SQLException e) {
				sb2.append(" "+str);
			}
		}
		map.put("success",sb1.toString());
		map.put("fail",sb2.toString());
		return map;
	}
	/**
	 * 관리자메뉴 - 상영표관리 - 상영표관리
	 * 삭제시 time_Table 에 있는 모든 time_table_no 를 가져온다.
	 */
	public ArrayList<String> getAllTimeTableNo() {
		ArrayList<String> list = null;
		try {
			list = adminDao.getAllTimeTableNo();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list;
	}
	/**
	 * 5/8아영추가사항
	 * @throws SQLException 
	 */
	public void regMovieToStatics(MovieVO vo) throws SQLException {
		adminDao.regMovieToStatics(vo);		
	}
	/**
	 * 여기서부터 시작 아영
	 */
	public void updateBoxOffice() throws SQLException {
		//1. sysdate 이전의 예매정보(즉, 이미 끝난 영화에 대한) 를 가져온다.
		ArrayList<StaticsVO> list = movieDao.getBeforeBoxUpdateRM();
		if(list!=null){ //reservation table에 내용이 있을 경우
			//2. 예매정보를 statics 테이블에 update 한다
			for(StaticsVO statics:list){
				//DB에 저장되어있던 특정 영화에 대한 누적관객수 불러오기
				int total = adminDao.getBoxOfficeCount(statics);
				System.out.println(statics.getMovie_no()+"업데이트 전 누적 관객 수 : "+total);
				total+=statics.getTotal_member();
				System.out.println("누적 후 관객 수 :"+total);
				statics.setTotal_member(total); //관객수 누적 시키기 
				adminDao.updateBoxOffice(statics);
			}
			//3. reservation table 지우기
			adminDao.deleteReservationWeek();
			//4. time_table 지우기
			adminDao.deleteTimeTableWeek();
		}		
	}
	/**
	 * 박스오피스 리스트
	 */
	public ArrayList<HashMap> getBoxOfficeList() throws SQLException {
		return movieDao.getBoxOfficeList();
	}

	public void screeningMovieDel(Map map) throws SQLException {
		adminDao.screeningMovieDel(map);
		
	}
	/**
	 * 영화검색
	 * @throws SQLException 
	 */
	public ArrayList<MovieVO> getSearchMovie(String method, String search_title) throws SQLException {
		ArrayList<MovieVO> list=null;
		if(method.equals("title")){
			list = movieDao.getSearchMovieByTitle(search_title);
		}else if(method.equals("genre")){
			list = movieDao.getSearchMovieByGenre(search_title);
		}else if(method.equals("country")){
			list = movieDao.getSearchMovieByCountry(search_title);
		}
		return list;
	}

	public boolean todayCheck(String day) {
		boolean flag = false;
		try {
			String today = adminDao.todayCheck();
			flag = todayCompareAsInsertDay(day, today);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return flag;
	}
	public boolean todayCompareAsInsertDay(String day, String today){
		boolean flag = false;
		StringBuffer sb1 = new StringBuffer(day);
		StringBuffer sb2 = new StringBuffer(today);
		int y1 = Integer.parseInt(sb1.substring(0,4));
		int m1 = Integer.parseInt(sb1.substring(5,7));
		int d1 = Integer.parseInt(sb1.substring(8,10));
		int y2 = Integer.parseInt(sb2.substring(0,4));
		int m2 = Integer.parseInt(sb2.substring(5,7));
		int d2 = Integer.parseInt(sb2.substring(8,10));
		System.out.println("day : "+y1+" "+m1+" "+d1);
		System.out.println("today : "+y2+" "+m2+" "+d2);
		if(y1>=y2){
			if(m1>m2){
					flag = true;
			}else if(m1==m2){
				if(d1>=d2){
					flag = true;
				}
			}
		}
		return flag;
	}

}
